php ereg漏洞,实验吧

您所在的位置:网站首页 php ereg函数 php ereg漏洞,实验吧

php ereg漏洞,实验吧

#php ereg漏洞,实验吧| 来源: 网络整理| 查看: 265

题目:啊拉?又是php审计。已经想吐了。

hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。

给我们提示:1)ereg()函数漏洞

2)科学计数法

viewsource:

if (isset ($_GET['password'])) {

if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)

{

echo '

You password must be alphanumeric

';

}

else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)

{

if (strpos ($_GET['password'], '*-*') !== FALSE)

{

die('Flag: ' . $flag);

}

else

{

echo('

*-* have not been found

');

}

}

else

{

echo '

Invalid password

';

}

}

?>

要拿到flag,需要做到:

1)ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE不成立

2)strlen($_GET['password']) < 8 && $_GET['password'] > 9999999

3)strpos ($_GET['password'], '*-*') !== FALSE

首先说明:===为完全相等,2=='2'  --> true ,2==='2'  --> false,即数据类型和值都要相等

!==为完全不等

解决1)用到ereg的漏洞:先满足需要由大小写字母和数组组成,然后%00截断,%00被识别为尾部,对其后面的字符不予理睬。

解决2)科学计数法满足长度和大小,如1e9

解决3)password中含有*-*

构造同时满足以上三个解决方案的password:1e9%00*-*

提交即得flag。

疑问解答:1)1e9%00*-*不是9个字符吗,为什么满足长度小于8?

答:%00是以编码形式存在,在长度判断中占一个长度。

2)为什么1e9%00*-*这个字符串大于9999999

答:在这两个数据的比较中,由于1e9%00*-*为字符串,>号为弱比较,1e9%00*-*取1e9,远大于9999999。

注意,有的博客写的是字符串和整型比较的时候,字符串只取前面的整数部分(意思就是在这里取1),这是有误的,在这种含e的情况下,会判断你是否符合科学计数法,符合的话按照科学计数法进行转换。

另解:

直接使用数组绕过:修改url  password[]=

许多的函数不能处理数组。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3